home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Commodore Disc 35
/
Commodore_Disc_35_19xx_-_de.d64
/
magic clock
(
.txt
)
< prev
next >
Wrap
Commodore BASIC
|
2022-10-26
|
4KB
|
194 lines
10 rem rubics clock====================
20 rem by alfons mittelmeyer
30 rem
40 rem fuer commodore computer
50 rem c116/c16/p4/c64/c128
60 rem
70 rem beispiel fuer guten
80 rem programmierstil
90 rem ================================
100 rem rechneranpassung
110 p=peek(772)
120 rx=781*(p=124)+2035*(p=86)+7*(p=13)
130 rx=-rx:ry=rx+1:goto1860
140 :
150 rem ----------- initialisierung -----
160 rem init
170 goto200
180 :
190 rem ausgabeinit
200 yk=3:xk=9:rem rahmenposition
210 lr$=" ":zr$=chr$(18)+" "+chr$(146)
220 lf$=chr$(17):bs$=chr$(157)
230 wa$=chr$(195):se$=chr$(194):lo$=chr$(176):ro$=chr$(174)
240 lu$=chr$(173):ru$=chr$(189):si$=chr$(122):so$=chr$(113)
250 :
260 rem varinit
270 dim f(43)
280 vo=0:hi=22:ze=13:sc=0
290 sc=0:rg=4:ze=13:vo=0:hi=22
300 ec(0)=0:ec(1)=2:ec(2)=6:ec(3)=8
310 :
320 rem funktionen
330 def fn yp(n)=int(n/3)*6+yk+3
340 def fn xp(n)=(n-int(n/3)*3)*7+xk+3
350 def fn ei(i)=f(i+vo)
360 def fn zw(b)=(ec(a)+ec(b))/2
370 def fn ko(n)=abs(n+12*((n=0)or(n=13)))
380 def fn ex(n)=((i and not n)or(not i and n))
390 def fn wt(i)=(NULL)((NULL)(fnei(x),fnei(i)),1)
400 :
410 rem zeitinit
420 x=rnd(-ti)
430 a=ze+vo:fori=a to a+8:f(i)=int(rnd(1)*12+1):next
440 a=ze+hi:fori=a to a+8:f(i)=int(rnd(1)*12+1):next
450 for i=0 to 3:f(ze+hi+ec(fnex(1)))=fnko(12-f(ec(i)+ze)):next
460 :
470 rem schaltinit
480 a=sc+vo:fori=a to a+3:f(i)=0:next
490 a=sc+hi:fori=a to a+3:f(i)=1:next
500 ra=0:return
510 :
520 rem ---------- ausgaberoutinen -----
530 rem plot
540 pokerx,y:pokery,x:sys65520:return
550 :
560 rem rahmen(yo,xl,yu,xr) var h,v,i,x,y,a$,b$
570 h=xr-xl-1:v=yu-yo-1
580 y=yo:x=xl:a$=lo$:b$=ro$:gosub620:x=xr:gosub630
590 x=xl:gosub630:y=yu:a$=lu$:b$=ru$:goto620
600 :
610 rem rahmh(y,x,a$,b$), rahmv(y,x)
620 gosub540: printa$;: fori=1 to h: printwa$;:next: printb$: return
630 gosub540: for i=1 to v: printlf$se$bs$;: next: return
640 :
650 rem uhrrahmen
660 yo=yk:yu=yk+18:xl=xk:xr=xk+21:gosub570
670 for j=0 to 8:yo=fnyp(j)-1:yu=yo+2
680 xl=fnxp(j)-1:xr=xl+3:gosub570:next:return
690 :
700 rem schaltplatz(i)
710 x=xk+7+(i and 1)*7:y=yk+6+int(i/2)*6:goto540
720 :
730 rem schaltstellung
740 a$=si$:if f(i+vo+sc)=0 then a$=so$
750 printa$;:return
760 :
770 rem zeigschalter(i)
780 gosub710:goto740
790 :
800 rem schaltbild
810 for i=0 to 3: gosub780:next:return
820 :
830 rem zeigzeit
840 for i=0 to 8:x=fnxp(i):y=fnyp(i):gosub540:printright$(" "+str$(f(i+ze+vo)),2);
850 next:return
860 :
870 rem zeigrad(ra)
880 gosub940:printzr$;:return
890 :
900 rem loeschrad(ra)
910 gosub940:printlr$;:return
920 :
930 rem radplatz(i)
940 x=xk-1+(ra and 1)*23:y=yk-1+int(ra/2)*20:goto540
950 :
960 rem ----------- riegel-logik -------
970 rem einsumme(/n)
980 n=0:a=sc+vo:for i=a to a+3:n=n+f(i):next:return
990 :
1000 rem eckriegeln
1010 for a=0 to 3:i=fnei(a):i=fnex(fnei(x))
1020 f(vo+rg+ec(a))=fnex(1):next:return
1030 :
1040 rem teilriegeln
1050 gosub980:if f(x+vo)=0 then 1110
1060 :
1070 rem untfall
1080 on n goto 1260,1200,1200,1200
1090 :
1100 rem obfall
1110 on n+1 goto 1230,1230,1370,1200
1120 :
1130 rem alles(w)
1140 ad=rg+vo:for i=ad to ad+8:f(i)=w:next:return
1150 :
1160 rem riegeln
1170 x=ra:gosub1050:gosub1520:i=x:x=fnex(1):gosub1050:goto1520
1180 :
1190 rem verriegeln
1200 w=0:gosub1140:goto1010
1210 :
1220 rem entriegeln
1230 w=1:gosub1140:goto1010
1240 :
1250 rem einknopfunten
1260 gosub1230:i=x:i=fnex(3):a=i
1270 f(vo+rg+fnzw(fnex(1)))=0
1280 f(vo+rg+fnzw(fnex(2)))=0
1290 return
1300 :
1310 rem welche
1320 for i=0 to 3
1330 if fnei(i)=1 then b=a:a=i
1340 next:a=fnzw(b):return
1350 :
1360 rem zweiknopfoben
1370 gosub1230:i=x
1380 if fnei(x)<>fnei(fnex(3))thengosub1320:f(rg+vo+a)=0
1390 return
1400 :
1410 rem ------------- teilprogramme ---
1420 rem nummer
1430 x=(asc(c$)-1)and3:return
1440 :
1450 rem schalten
1460 gosub1490:goto1490
1470 :
1480 rem teilschalten(x)
1490 a=x+sc+vo:i=f(a):f(a)=fnex(1):gosub1520:i=x:x=fnex(1):return
1500 :
1510 rem wenden
1520 a=vo:vo=hi:hi=a:return
1530 :
1540 rem schaltung
1550 gosub1430:gosub1460:i=x:gosub780:goto1170
1560 :
1570 rem wendung
1580 gosub910:i=ra:ra=fnex(1):gosub880
1590 gosub1520:gosub810:goto840
1600 :
1610 rem drehen
1620 gosub1650:x=-x:goto1650
1630 :
1640 teildrehen
1650 ad=rg+vo:for i=ad to ad+8
1660 if f(i)=1 then f(i+9)=fnko(f(i+9)+x)
1670 next:goto1520
1680 :
1690 rem drehung
1700 x=1:if c$="-" then x=-1
1710 gosub1620:goto840
1720 :
1730 rem radwahl
1740 gosub910:gosub1900:gosub1430:ra=x:gosub880:goto1170
1750 :
1760 rem ------------- hauptprogramm ---
1770 rem anfang
1780 printchr$(147):gosub170:gosub660:gosub810:gosub840:gosub880:goto1170
1790 :
1800 rem tastwertung
1810 n=0:fori=1to8:ifc$=mid$("1234.+-0",i,1) then n=i:i=8
1820 next:on n goto 1550,1550,1550,1550,1740,1700,1700,1580
1830 return
1840 :
1850 rem hauptschleife
1860 gosub1780
1870 gosub1900:gosub1810:goto1870
1880 :
1890 rem eingabe
1900 get c$:if c$="" then 1900
1910 return
1920 :
1930 rem =========== e n d e ===========